﻿using System;
using System.Collections;
using System.Collections.Generic;
using System.Configuration;
using System.Data;
using System.Linq;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.HtmlControls;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Xml.Linq;
using BLL.BusinessClasses;

namespace WebSite.Empresa
{
    public partial class Perfil : System.Web.UI.Page
    {
        protected void Page_Load(object sender, EventArgs e)
        {
            if (this.Session["UsuarioDeSesion"] == null || !(this.Session["UsuarioDeSesion"] is UsuarioEmpresa))
            {
                this.Response.Redirect(@"~/General/Principal.aspx");
                //this.Response.Redirect(@"../General/Login.aspx");
            }
            if (!(this.Page.IsPostBack))
            {
                this.DarBienvenida();
            } 
        }                
        private void DarBienvenida()
        {
            ((Label)(this.Master.FindControl("Label_Bienvenida"))).Text = "Bienvenido <u>" +
                                                                          ((UsuarioEmpresa)this.Session["UsuarioDeSesion"]).EmpresaProcedencia.Nombre + 
                                                                          "</u>";
        }
        protected void Button_LogOff_Click(object sender, EventArgs e)
        {
            this.Session["UsuarioDeSesion"] = null;
            this.Response.Redirect(@"../General/Principal.aspx");
        }

        protected void Esconder_ContenidoPagina()
        {
            if (this.Panel_Perfil.Visible)
            {
                this.Panel_Perfil.Visible = false;
                this.Button_MostrarPanelPerfil.Text = "▼";
            }

            if (this.Panel_Contactos.Visible)
            {
                this.Panel_Contactos.Visible = false;
                this.Button_MostrarPanelContactos.Text = "▼";
            }

            if (this.Panel_UsuariosEmpresa.Visible)
            {
                this.Panel_UsuariosEmpresa.Visible = false;
                this.Button_MostrarPanelUsuariosEmpresa.Text = "▼";
            }

            if (this.Panel_Contratacion.Visible)
            {
                this.Panel_Contratacion.Visible = true;
                this.Button_MostrarPanelContratacion.Text = "▼";
            }
        }

        //Show/Hide Event Handlers
        protected void Button_MostrarPanelPerfil_Click(object sender, EventArgs e)
        {
            Esconder_ContenidoPagina();
            this.Panel_Perfil.Visible = !(this.Panel_Perfil.Visible);

            if (this.Panel_Perfil.Visible) 
            {
                this.PoblarCampos_Perfil();
                this.Button_MostrarPanelPerfil.Text = "▲"; 
            }
            else this.Button_MostrarPanelPerfil.Text = "▼";
        }

        protected void Button_MostrarPanelContactos_Click(object sender, EventArgs e)
        {
            Esconder_ContenidoPagina();
            this.Panel_Contactos.Visible = !(this.Panel_Contactos.Visible);
            this.GridView_UsuariosActivos.SelectedIndex = -1;
            this.GridView_UsuariosInactivos.SelectedIndex = -1;

            if (this.Panel_Contactos.Visible) 
            {
                this.PoblarCampos_Contactos();
                this.Button_MostrarPanelContactos.Text = "▲"; 
            }
            else this.Button_MostrarPanelContactos.Text = "▼";
        }

        protected void Button_MostrarPanelUsuariosEmpresa_Click(object sender, EventArgs e)
        {
            Esconder_ContenidoPagina();
            this.Panel_UsuariosEmpresa.Visible = !(this.Panel_UsuariosEmpresa.Visible);
            
            this.GridView_UsuariosActivos.SelectedIndex = -1;
            this.GridView_UsuariosInactivos.SelectedIndex = -1;

            if (this.Panel_UsuariosEmpresa.Visible) 
            {
                this.PoblarCampos_Usuarios();
                this.Button_MostrarPanelUsuariosEmpresa.Text = "▲"; 
            }
            else this.Button_MostrarPanelUsuariosEmpresa.Text = "▼";
        }

        protected void Button_MostrarPanelContratacion_Click(object sender, EventArgs e)
        {
            Esconder_ContenidoPagina();
            this.Panel_Contratacion.Visible = !(this.Panel_Contratacion.Visible);

            if (this.Panel_Contratacion.Visible)
            {
                this.Button_MostrarPanelContratacion.Text = "▲";
            }
            else this.Button_MostrarPanelContratacion.Text = "▼";
        }

        //PoblarCampos Methods
        private void PoblarCampos_Perfil()
        {
            if (((UsuarioEmpresa)this.Session["UsuarioDeSesion"]).EmpresaProcedencia.Logo != null) 
            {
                this.Image_LogoEmpresa.ImageUrl = ((UsuarioEmpresa)this.Session["UsuarioDeSesion"]).EmpresaProcedencia.Logo;
            }
            else 
            {
                this.Image_LogoEmpresa.ImageUrl = "~\\Pictures\\CompanyPictures\\DefaultCompanyPic.png";
            }

            this.TextBox_RNC.Text = ((UsuarioEmpresa)this.Session["UsuarioDeSesion"]).EmpresaProcedencia.RNC;
            this.TextBox_Nombre.Text = ((UsuarioEmpresa)this.Session["UsuarioDeSesion"]).EmpresaProcedencia.Nombre;
            this.TextBox_Direccion.Text = ((UsuarioEmpresa)this.Session["UsuarioDeSesion"]).EmpresaProcedencia.Direccion;
            this.TextBox_Descripcion.Text = ((UsuarioEmpresa)this.Session["UsuarioDeSesion"]).EmpresaProcedencia.Descripcion;
            this.TextBox_Contacto.Text = ((UsuarioEmpresa)this.Session["UsuarioDeSesion"]).EmpresaProcedencia.PersonaContacto;
            this.TextBox_CargoContacto.Text = ((UsuarioEmpresa)this.Session["UsuarioDeSesion"]).EmpresaProcedencia.CargoPersonaContacto;
            this.DropDownList_Paises.SelectedValue = ((UsuarioEmpresa)this.Session["UsuarioDeSesion"]).EmpresaProcedencia.Pais.ID.ToString();
        }
        private void PoblarCampos_Contactos()
        {
            List<Contacto> Contactos = ((UsuarioEmpresa)this.Session["UsuarioDeSesion"]).EmpresaProcedencia.Contactos;

            Contacto Email = Contactos.Find(delegate(Contacto X) { return X.TipoContacto.ToLower().Trim() == "email"; });
            Contacto Tel = Contactos.Find(delegate(Contacto X) { return X.TipoContacto.ToLower().Trim() == "telefono"; });
            Contacto Cel = Contactos.Find(delegate(Contacto X) { return X.TipoContacto.ToLower().Trim() == "celular"; });

            if (Email != null && Email.Descripcion != string.Empty)
            {
                TextBox_EMail.Text = Email.Descripcion;
            }

            if (Tel != null && Tel.Descripcion != string.Empty)
            {
                this.TextBox_Telefono.Text = Tel.Descripcion;
            }

            if (Cel != null && Cel.Descripcion != string.Empty)
            {
                this.TextBox_TelefonoMovil.Text = Cel.Descripcion;

                //String[] Celular = Cel.Descripcion.Split('-');
                //TextBox_Movil1_1.Text = Celular[0];
                //TextBox_Movil1_2.Text = Celular[1];
                //TextBox_Movil1_3.Text = Celular[2];
                //TextBox_Movil1_4.Text = Celular[3];
            }
        }
        private void PoblarCampos_Usuarios()
        {
            this.PoblarGridView_UsuariosActivos();
            this.PoblarGridView_UsuariosInactivos();
        }

        private void PoblarGridView_UsuariosActivos()
        {
            var UsuariosActivosSource = from ue in ((UsuarioEmpresa)this.Session["UsuarioDeSesion"]).EmpresaProcedencia.Usuarios
                                        where ue.SiActivo == true
                                        select new
                                        {
                                            ID = ue.ID,
                                            UserName = ue.UserName,
                                            PassWord = ue.PassWord,
                                            FechaCreacion = ue.FechaCreacion,
                                            FechaPrimerIngreso = ue.FechaPrimerIngreso,
                                            FechaUltimoIngreso = ue.FechaUltimoIngreso
                                        };

            this.GridView_UsuariosActivos.DataSource = UsuariosActivosSource;
            this.GridView_UsuariosActivos.DataBind();
        }
        private void PoblarGridView_UsuariosInactivos()
        {
            var UsuariosInactivosSource = from ue in ((UsuarioEmpresa)this.Session["UsuarioDeSesion"]).EmpresaProcedencia.Usuarios
                                          where ue.SiActivo == false
                                          select new
                                          {
                                              ID = ue.ID,
                                              UserName = ue.UserName,
                                              PassWord = ue.PassWord,
                                              FechaCreacion = ue.FechaCreacion,
                                              FechaPrimerIngreso = ue.FechaPrimerIngreso,
                                              FechaUltimoIngreso = ue.FechaUltimoIngreso
                                          };

            this.GridView_UsuariosInactivos.DataSource = UsuariosInactivosSource;
            this.GridView_UsuariosInactivos.DataBind();
        }

        // Button_Click Event Handlers
        protected void Button_ModificarPerfil_Click(object sender, EventArgs e)
        {
            try
            {
                UsuarioEmpresa ThisUser = (UsuarioEmpresa)this.Session["UsuarioDeSesion"];

                ThisUser.EmpresaProcedencia.Direccion = TextBox_Direccion.Text.Trim();
                ThisUser.EmpresaProcedencia.RNC = TextBox_RNC.Text.Trim();
                ThisUser.EmpresaProcedencia.Descripcion = TextBox_Descripcion.Text.Trim();
                ThisUser.EmpresaProcedencia.Nombre = TextBox_Nombre.Text.Trim();
                ThisUser.EmpresaProcedencia.PersonaContacto = TextBox_Contacto.Text.Trim();
                ThisUser.EmpresaProcedencia.CargoPersonaContacto = TextBox_CargoContacto.Text.Trim();
                ThisUser.EmpresaProcedencia.Pais = new Pais(Convert.ToInt32(this.DropDownList_Paises.SelectedValue));
                
                UploadFoto();

                ThisUser.EmpresaProcedencia.Actualizar();

                this.PoblarCampos_Perfil();
            }
            catch (Exception)
            {
                this.Label_MensajeErrorModificarPerfil.Visible = true;
            }
        }
        protected void Button_ModificarContactos_Click(object sender, EventArgs e)
        {
            try
            {
                UsuarioEmpresa ThisUser = (UsuarioEmpresa)this.Session["UsuarioDeSesion"];
                List<Contacto> Contactos = ThisUser.EmpresaProcedencia.Contactos;

                Contacto Email = Contactos.Find(delegate(Contacto X) { return X.TipoContacto.ToLower().Trim() == "email"; });
                Contacto Tel = Contactos.Find(delegate(Contacto X) { return X.TipoContacto.ToLower().Trim() == "telefono"; });
                Contacto Cel = Contactos.Find(delegate(Contacto X) { return X.TipoContacto.ToLower().Trim() == "celular"; });

                if (Email != null)
                {
                    ThisUser.EmpresaProcedencia.ModificarContacto(Email.ID, this.TextBox_EMail.Text.Trim());
                }
                else
                {
                    ThisUser.EmpresaProcedencia.AgregarContacto(Contacto.GetIDByTipoContactoDescripcion("Email"), this.TextBox_EMail.Text.Trim());
                }

                if (Tel != null)
                {
                    ThisUser.EmpresaProcedencia.ModificarContacto(Tel.ID, this.TextBox_Telefono.Text.Trim());
                }
                else
                {
                    ThisUser.EmpresaProcedencia.AgregarContacto(Contacto.GetIDByTipoContactoDescripcion("Telefono"), this.TextBox_Telefono.Text.Trim());
                }

                if (Cel != null)
                {
                    ThisUser.EmpresaProcedencia.ModificarContacto(Cel.ID, this.TextBox_TelefonoMovil.Text.Trim());
                }
                else
                {
                    ThisUser.EmpresaProcedencia.AgregarContacto(Contacto.GetIDByTipoContactoDescripcion("Celular"), this.TextBox_TelefonoMovil.Text.Trim());
                }

                //foreach (Contacto C in ThisUser.EmpresaProcedencia.Contactos)
                //{
                //    ThisUser.EmpresaProcedencia.EliminarContacto(C.ID);
                //}

                //ThisUser.EmpresaProcedencia.AgregarContacto(Contacto.GetIDByTipoContactoDescripcion("Email"),
                //                                            this.TextBox_EMail.Text.Trim());

                //ThisUser.EmpresaProcedencia.AgregarContacto(Contacto.GetIDByTipoContactoDescripcion("Celular"),
                //                                            this.TextBox_TelefonoMovil.Text.Trim());

                //ThisUser.EmpresaProcedencia.AgregarContacto(Contacto.GetIDByTipoContactoDescripcion("Telefono"),
                //                                            this.TextBox_Telefono.Text.Trim());

            }
            catch (Exception) 
            {
                this.Label_MensajeErrorModificarContactos.Visible = true;
            }

        }
        protected void Button_DesactivarUsuario_Click(object sender, EventArgs e)
        {
            if (((UsuarioEmpresa)this.Session["UsuarioDeSesion"]).ID != Convert.ToInt32(this.GridView_UsuariosActivos.SelectedValue))
            {
                try
                {
                    ((UsuarioEmpresa)this.Session["UsuarioDeSesion"]).EmpresaProcedencia.DesactivarUsuarioEmpresa(Convert.ToInt32(this.GridView_UsuariosActivos.SelectedValue));

                    this.GridView_UsuariosActivos.SelectedIndex = -1;

                    this.PoblarCampos_Usuarios();
                }
                catch (Exception)
                {
                    this.Label_MensajeErrorDesactivarUsuario.Text = "Intente desactivar este usuario luego";
                    this.Label_MensajeErrorDesactivarUsuario.Visible = true;
                }
            }
            else
            {
                this.Label_MensajeErrorDesactivarUsuario.Text = "No puede desactivarse a usted mismo!";
                this.Label_MensajeErrorDesactivarUsuario.Visible = true;
            }
        }
        protected void Button_ActivarUsuario_Click(object sender, EventArgs e)
        {
            try
            {
                ((UsuarioEmpresa)this.Session["UsuarioDeSesion"]).EmpresaProcedencia.ActivarUsuarioEmpresa(Convert.ToInt32(this.GridView_UsuariosInactivos.SelectedValue));

                this.GridView_UsuariosInactivos.SelectedIndex = -1;

                this.PoblarCampos_Usuarios();
            }
            catch (Exception)
            {                
                this.Label_MensajeErrorReactivarUsuario.Visible = true;
            }
        }
        protected void Button_CrearUsuario_Click(object sender, EventArgs e)
        {
            try
            {
                ((UsuarioEmpresa)this.Session["UsuarioDeSesion"]).EmpresaProcedencia.CrearUsuario(this.TextBox_UserNameNuevoUsuario.Text, 
                                                                                                  Encryption.GetMD5Hash(this.TextBox_PassWordNuevoUsuario.Text));

                this.PoblarCampos_Usuarios();
            }
            catch (Exception)
            {
                this.Label_MensajeErrorNuevoUsuario.Visible = true;
            }
        }
        protected void Button_SometerContratacion_Click(object sender, EventArgs e)
        {
            if (this.DropDownList_Contratado.SelectedValue != "0")
            {
                try
                {
                    ((UsuarioEmpresa)this.Session["UsuarioDeSesion"]).SometerContratacion(DropDownList_Contratado.SelectedValue);

                    this.Label_MensajeErrorContratacion.Text = "La contratacion fue sometida exitosamente";
                    this.Label_MensajeErrorContratacion.Visible = true;

                }
                catch
                {
                    this.Label_MensajeErrorContratacion.Text = "No se ha podido someter la contratacion. Por favor intente luego";
                    this.Label_MensajeErrorContratacion.Visible = true;
                }
            }
            else
            {
                this.Label_MensajeErrorContratacion.Text = "Por favor elija un tipo de contratado";
                this.Label_MensajeErrorContratacion.Visible = true;
            }
        }        

        //Helper Methods
        private void UploadFoto()
        {
            string SavePath = Request.PhysicalApplicationPath + ConfigurationSettings.AppSettings["CompanyPictureUploadPath"] + ((UsuarioEmpresa)this.Session["UsuarioDeSesion"]).EmpresaProcedencia.RNC + ".png";

            try
            {
                if (this.FileUpload_UploadFoto.HasFile)
                {
                    if (this.FileUpload_UploadFoto.FileName.EndsWith(".png") || this.FileUpload_UploadFoto.FileName.EndsWith(".jpg") || this.FileUpload_UploadFoto.FileName.EndsWith(".bmp"))
                    {
                        if (this.FileUpload_UploadFoto.PostedFile.ContentLength < 1048576)
                        {
                            FileUpload_UploadFoto.SaveAs(SavePath);
                        }
                        else
                        {
                            this.Label_UploadStatus.Text = "No se ha podido subir la foto. Exede el limite de 1 MB.";
                            this.Label_UploadStatus.Visible = true;
                            return;
                        }
                    }
                    else
                    {
                        this.Label_UploadStatus.Text = "No se ha podido subir la foto. Formato no soportado.";
                        this.Label_UploadStatus.Visible = true;
                        return;
                    }

                    ((UsuarioEmpresa)this.Session["UsuarioDeSesion"]).EmpresaProcedencia.Logo = "~" + ConfigurationSettings.AppSettings["CompanyPictureUploadPath"] + ((UsuarioEmpresa)this.Session["UsuarioDeSesion"]).EmpresaProcedencia.RNC + ".png";
                }

            }
            catch
            {
                this.Label_UploadStatus.Text = "No se ha podido subir la foto. Intente luego.";
            }
        }

        protected void GridView_UsuariosActivos_SelectedIndexChanged(object sender, EventArgs e)
        {
            this.Button_DesactivarUsuario.Enabled = true;
        }
        protected void GridView_UsuariosInactivos_SelectedIndexChanged(object sender, EventArgs e)
        {
            this.Button_ActivarUsuario.Enabled = true;
        }

        protected object EvalIfFechaPrimerIngresoEqualsNull()
        {
            return (Eval("FechaPrimerIngreso") == null) ? "<span class=\"LetraRoja\">No Disponible</span>" : Eval("FechaPrimerIngreso");
        }
        protected object EvalIfFechaUltimoIngresoEqualsNull()
        {
            return (Eval("FechaUltimoIngreso") == null) ? "<span class=\"LetraRoja\">No Disponible</span>" : Eval("FechaUltimoIngreso");
        }
    }
}